﻿#include <learn/alg/alg_delaunay.h>

using namespace xi::alg;

std::shared_ptr<Mesh3D<3>> Alg_Lawson_Delaunay::generate(std::vector<Vec3f> &&points)
{
    return nullptr;
    // // 计算包围盒
    // double xmin = FLT_MAX;
    // double xmax = FLT_MIN;
    // double ymin = FLT_MAX;
    // double ymax = FLT_MIN;

    // for (auto &p : points)
    // {
    //     if (p.X() > xmax)
    //         xmax = p.X();
    //     if (p.X() < xmin)
    //         xmin = p.X();
    //     if (p.Y() > ymax)
    //         ymax = p.Y();
    //     if (p.Y() < ymin)
    //         ymin = p.Y();
    // }

    // // 创建初始顶点
    // HalfMesh mesh;
    // auto v0 = mesh.CreateVertex(Handle(Geom_Point)(new Geom_CartesianPoint{xmin, ymin, 0}));
    // auto v1 = mesh.CreateVertex(Handle(Geom_Point)(new Geom_CartesianPoint{xmax, ymin, 0}));
    // auto v2 = mesh.CreateVertex(Handle(Geom_Point)(new Geom_CartesianPoint{xmax, ymax, 0}));
    // auto v3 = mesh.CreateVertex(Handle(Geom_Point)(new Geom_CartesianPoint{xmin, ymax, 0}));

    // std::vector<VertexHandle> vList({v0, v1, v2, v3});
    // std::vector<VertexHandle> f1({v0, v1, v2});
    // std::vector<VertexHandle> f2({v0, v2, v3});

    // // 初始化网格
    // std::queue<FaceHandle> pre;
    // pre.push(mesh.CreateFace(f1).front());
    // pre.push(mesh.CreateFace(f2).front());

    // int index = 1;
    // while (!pre.empty())
    // {
    //     auto f = pre.front();
    //     pre.pop();

    //     auto vertices = mesh.Vertices(f);
    //     std::vector<gp_Pnt2d> triangle;
    //     triangle.push_back({vertices[0]->Geom()->Pnt().X(), vertices[0]->Geom()->Pnt().Y()});
    //     triangle.push_back({vertices[1]->Geom()->Pnt().X(), vertices[1]->Geom()->Pnt().Y()});
    //     triangle.push_back({vertices[2]->Geom()->Pnt().X(), vertices[2]->Geom()->Pnt().Y()});

    //     auto O = circum_center(triangle);
    //     double r = O.Distance(triangle[0]);

    //     // 检查 t 是否满足空圆性质
    //     EdgeHandle e = nullptr;
    //     for (auto v : vList)
    //     {
    //         gp_Pnt q = v->Geom()->Pnt().XYZ();
    //         gp_Pnt2d p = {q.X(), q.Y()};
    //         if (O.Distance(p) < r)
    //         {
    //             // 计算重心坐标
    //             auto c = barycentric(p, triangle);
    //             if (c.X() <= 0)
    //             {
    //                 e = mesh.Opposite(f, vertices[0])->Edge();
    //             }
    //             else if (c.Y() <= 0)
    //             {
    //                 e = mesh.Opposite(f, vertices[1])->Edge();
    //             }
    //             else
    //             {
    //                 e = mesh.Opposite(f, vertices[2])->Edge();
    //             }
    //             break;
    //         }
    //     }

    //     // 不满足则翻转边
    //     if (e != nullptr)
    //     {
    //         mesh.FlipEdge(e);
    //     }

    //     // 加入新的顶点
    //     auto p = points.Value(index);
    //     auto v = mesh.CreateVertex(Handle(Geom_Point)(new Geom_CartesianPoint{p.X(), p.Y(), 0}));
    //     vList.push_back(v);

    //     // 进一步处理
    // }

    // auto handle = mesh.RequireVertexTexcoords();
    // for (auto &v : mesh.Vertices())
    // {
    //     mesh.Property(handle, v) = {v->Geom()->Pnt().X(), v->Geom()->Pnt().Y()};
    // }
    // return mesh.Triangulation();
}